#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"DataType.h"


//创建二叉树
BiTreeNode* BuyNode(BTDataType x);//创建结点
BiTreeNode* CreateBiTree();//手搓创建二叉树
void crt_tree(BiTree* T);//以字符串“根左子树右子树”形式创建二叉链表（递归算法）
void CreateBiTreeGY(BiTree* BT, char* s);//以二叉树的广义表表示的字符串创建二叉树
void Crear_BiTree(BiTree* T);//读边创建二叉链表——层次遍历的运用
void CrtBT(BiTree* T, char pre[], char ino[], int ps, int is, int n);//通过先序序列和中序序列来创建二叉树

//遍历二叉树
void PreOrder(BiTree root);//前序遍历
void InOrder(BiTree root);//中序遍历
void PostOrder(BiTree root);//后序遍历
void InOrder_iter(BiTree T);//非递归遍历——任务分析（中序序列遍历）
void NrPostOrder(BiTree T);//非递归遍历——路径分析（后序序列遍历）
BiTree PriGoFarLeft(BiTree T, Stack* S, char* c);//寻找子树最左下方的结点
void NrPreOrder(BiTree T);//非递归遍历——路径分析（先序遍历）
void LayerBiTree(BiTree T);//非递归遍历——层次遍历

int BiTreeSize(BiTree root);//计算二叉树的结点数
int BiTreeHeight(BiTree root);//计算二叉树的高度
int BiTreeK(BiTree root, int k);//计算二叉树第K层结点的数量
BiTree BinaryTreeFind(BiTree root, BTDataType x);//根据x找到结点的地址
void BiTreeLeafCount(BiTree root,int *count);//计算二叉树的叶子结点个数

//显示二叉树
void dispBiTree(BiTree T, int level, char c);//以凹入表的形式显示二叉树
void GListBiTree(BiTree T);//以广义表的形式显示二叉树
